// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// ReSharper disable CheckNamespace
// ReSharper disable CommentTypo
// ReSharper disable InconsistentNaming

/* AxisLabel.cs -- обрабатывает данные, связанные с текстовым заголовком
 * Ars Magna project, http://arsmagna.ru
 */

#region Using directives

using System;
using System.Drawing;
using System.Runtime.Serialization;

#endregion

#nullable enable

namespace AM.Drawing.Charting;

/// <summary>
/// Класс, который обрабатывает данные, связанные с текстовым
/// заголовком и связанными с ним свойствами шрифта. Наследуется
/// от <see cref="Label" /> и добавляет свойства
/// <see cref="IsOmitMag" /> и <see cref="IsTitleAtCross" />,
/// которые специально связаны с <see cref="Axis" />.
/// <see cref="Axis.Title" />.
/// </summary>
[Serializable]
public class AxisLabel
    : GapLabel, ICloneable, ISerializable
{
    #region Constructors

    /// <summary>
    /// Constructor to build an <see cref="AxisLabel" /> from the text and the
    /// associated font properties.
    /// </summary>
    /// <param name="text">The <see cref="string" /> representing the text to be
    /// displayed</param>
    /// <param name="fontFamily">The <see cref="String" /> font family name</param>
    /// <param name="fontSize">The size of the font in points and scaled according
    /// to the <see cref="PaneBase.CalcScaleFactor" /> logic.</param>
    /// <param name="color">The <see cref="Color" /> instance representing the color
    /// of the font</param>
    /// <param name="isBold">true for a bold font face</param>
    /// <param name="isItalic">true for an italic font face</param>
    /// <param name="isUnderline">true for an underline font face</param>
    public AxisLabel
        (
            string text,
            string fontFamily,
            float fontSize,
            Color color,
            bool isBold,
            bool isItalic,
            bool isUnderline
        )
        : base (text, fontFamily, fontSize, color, isBold, isItalic, isUnderline)
    {
        IsOmitMag = false;
        IsTitleAtCross = true;
    }

    /// <summary>
    /// Copy constructor
    /// </summary>
    /// <param name="rhs">the <see cref="AxisLabel" /> instance to be copied.</param>
    public AxisLabel
        (
            AxisLabel rhs
        )
        : base (rhs)
    {
        IsOmitMag = rhs.IsOmitMag;
        IsTitleAtCross = rhs.IsTitleAtCross;
    }

    /// <inheritdoc cref="ICloneable.Clone"/>
    object ICloneable.Clone()
    {
        return Clone();
    }

    /// <summary>
    /// Typesafe, deep-copy clone method.
    /// </summary>
    /// <returns>A new, independent copy of this class</returns>
    public new AxisLabel Clone()
    {
        return new AxisLabel (this);
    }

    #endregion

    #region Properties

    /// <summary>
    /// Gets or sets the property that controls whether or not the magnitude factor (power of 10) for
    /// this scale will be included in the label.
    /// </summary>
    /// <remarks>
    /// For large scale values, a "magnitude" value (power of 10) is automatically
    /// used for scaling the graph.  This magnitude value is automatically appended
    /// to the end of the Axis <see cref="Axis.Title"/> (e.g., "(10^4)") to indicate
    /// that a magnitude is in use.  This property controls whether or not the
    /// magnitude is included in the title.  Note that it only affects the axis
    /// title; a magnitude value may still be used even if it is not shown in the title.
    /// </remarks>
    /// <value>true to show the magnitude value, false to hide it</value>
    /// <seealso cref="Axis.Title"/>
    /// <seealso cref="Scale.Mag"/>
    /// <seealso cref="Scale.Format"/>
    public bool IsOmitMag { get; set; }

    /// <summary>
    /// Gets or sets a value that determines whether the Axis title is located at the
    /// <see cref="Axis.Cross" />
    /// value or at the normal position (outside the <see cref="Chart.Rect" />).
    /// </summary>
    /// <remarks>
    /// This value only applies if <see cref="Axis.CrossAuto" /> is false.
    /// </remarks>
    public bool IsTitleAtCross { get; set; }

    #endregion

    #region Serialization

    /// <summary>
    /// Current schema value that defines the version of the serialized file
    /// </summary>
    public const int schema3 = 10;

    /// <summary>
    /// Constructor for deserializing objects
    /// </summary>
    /// <param name="info">A <see cref="SerializationInfo"/> instance that defines the serialized data
    /// </param>
    /// <param name="context">A <see cref="StreamingContext"/> instance that contains the serialized data
    /// </param>
    protected AxisLabel
        (
            SerializationInfo info,
            StreamingContext context
        )
        : base (info, context)
    {
        // The schema value is just a file version parameter.  You can use it to make future versions
        // backwards compatible as new member variables are added to classes
        info.GetInt32 ("schema3").NotUsed();

        IsOmitMag = info.GetBoolean ("isOmitMag");
        IsTitleAtCross = info.GetBoolean ("isTitleAtCross");
    }

    /// <inheritdoc cref="ISerializable.GetObjectData"/>
    public override void GetObjectData
        (
            SerializationInfo info,
            StreamingContext context
        )
    {
        base.GetObjectData (info, context);

        info.AddValue ("schema3", schema2);
        info.AddValue ("isOmitMag", IsVisible);
        info.AddValue ("isTitleAtCross", IsTitleAtCross);
    }

    #endregion
}
